﻿// 方程的解.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*
http://ybt.ssoier.cn:8088/problem_show.php?pid=1653
https://loj.ac/p/10231

佳佳碰到了一个难题，请你来帮忙解决。对于不定方程 a1+a2+⋯+ak−1+ak=g(x)，其中 k≥2 且 k∈N∗ ，x 是正整数，
g(x)=xxmod1000（即 xx 除以 1000 的余数），x,k 是给定的数。我们要求的是这个不定方程的正整数解组数。

举例来说，当 k=3,x=2 时，方程的解分别为：

⎧⎩⎨a1=1a2=1a3=2⎧⎩⎨a1=1a2=2a3=1⎧⎩⎨a1=2a2=1a3=1
【输入】
有且只有一行，为用空格隔开的两个正整数，依次为 k,x。

【输出】
有且只有一行，为方程的正整数解组数。

【输入样例】
3 2
【输出样例】
3
【提示】
数据范围与提示：

对于 40% 数据，答案不超过 1016 ；

对于全部数据，1≤k≤100,1≤x<231,k≤g(x)。
*/

#include <iostream>

using namespace std;

const int N = 150;
int k, x;
int f[2][100][N];


void add(int c[], int a[], int b[]) {
	for (int i = 0, t = 0; i < N; i++) {
		t += a[i] + b[i];
		c[i] = t % 10;
		t /= 10;
	}
}

int qmi(int a, int b, int p) {
	int res = 1;
	while (b) {
		if (b & 1) res = 1LL*res * a % p;
		a = 1ll*a * a % p;
		b >>= 1;
	}
	return res;
}

int main()
{
	cin >> k >> x;

	int n = qmi(x , x, 1000);
	int prev = 0; int curr = 1;
	for (int i = 0; i < n; i++){
		for (int j = 0; j <= i && j < k; j++) {
			if (!j) f[curr][j][0] = 1;
			else add(f[curr][j], f[prev][j], f[prev][j - 1]);	// f[i][j] = f[i - 1][j] + f[i - 1][j - 1];
		}
		swap(curr, prev);
	}
	if (!n)	//注意当n==0时 需要特判，否则后面f[n-1][k-1] 会数组越界
	{
		cout << "0" << endl;
		return 0;
	}

	int* g = f[prev][k - 1];
	int i = N - 1;
	while (!g[i]) i--;
	while (i >= 0) cout << g[i--];

	return 0;
}

